﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.Data.EntityModel;
using SMG.Presentation.Generics;

namespace SMG.Presentation
{
    /// <summary>
    /// Interaction logic for WPessoa.xaml
    /// </summary>
    public partial class WPessoa : Window, IWindowCrud
    {
        #region Constructors
        public WPessoa()
        {
            InitializeComponent();
            lstButton.Add(this.btnNovo);
            lstButton.Add(this.btnAlterar);
            lstButton.Add(this.btnCancelar);
            lstButton.Add(this.btnConsultar);
            lstButton.Add(this.btnExcluir);
            lstButton.Add(this.btnSair);
            lstButton.Add(this.btnSalvar);
        }
        #endregion

        #region Attributes
        Pessoa entidade;
        List<Button> lstButton = new List<Button>();
        #endregion

        #region IWindowCrud Members

        public void btnNovo_Click(object sender, RoutedEventArgs e)
        {
            this.Clean();
            this.gridForm.IsEnabled = true;
            CrudButtonResolver.SetStateEditing(lstButton);
        }

        public void btnAlterar_Click(object sender, RoutedEventArgs e)
        {
            this.gridForm.IsEnabled = true;
            CrudButtonResolver.SetStateEditing(lstButton);
        }

        public void btnSalvar_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                this.Validate();

                this.LoadEntity();

                using (Data bd = new Data(Util.getConnectionString()))
                {
                    if (entidade.Codigo == 0)
                    {
                        if (bd.Pessoas.Count() > 0)
                            entidade.Codigo = bd.Pessoas.ToList().Last().Codigo + 1;
                        else
                            entidade.Codigo = 1;
                        bd.Pessoas.InsertOnSubmit(entidade);
                    }
                    else
                    {
                        Pessoa update = bd.Pessoas.Where(q => q.Codigo.Equals(entidade.Codigo)).First();
                        update.Nome = entidade.Nome;
                        update.Email = entidade.Email;
                        update.Celular = entidade.Celular;
                        update.CodigoGrupo = entidade.CodigoGrupo;
                        update.Nascimento = entidade.Nascimento;
                        update.Telefone = entidade.Telefone;
                    }

                    bd.SubmitChanges();

                    MessageBox.Show("Pessoa gravada com sucesso.");
                }

                this.gridForm.IsEnabled = false;
                CrudButtonResolver.SetStateLoaded(lstButton);
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        public void btnConsultar_Click(object sender, RoutedEventArgs e)
        {
            WPessoaConsulta consulta = new WPessoaConsulta();
            consulta.ShowDialog();

            try
            {
                if (consulta.retorno != null)
                {
                    entidade = consulta.retorno;

                    this.txtNome.Text = entidade.Nome;
                    this.txtCelular.Text = entidade.Celular;
                    this.txtEmail.Text = entidade.Email;
                    this.txtTelefone.Text = entidade.Telefone;
                    this.dptNascimento.SelectedDate = entidade.Nascimento;
                    if (entidade.CodigoGrupo.HasValue)
                        this.cboGrupo.SelectedValue = entidade.CodigoGrupo.Value;

                    CrudButtonResolver.SetStateLoaded(lstButton);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        public void btnExcluir_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                if (MessageBox.Show("Tem certeza que deseja excluir?", "Mail Sender", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
                {
                    using (Data bd = new Data(Util.getConnectionString()))
                    {
                        Pessoa exclude = (from g in bd.Pessoas
                                          where g.Codigo.Equals(entidade.Codigo)
                                          select g).First();

                        bd.Pessoas.DeleteOnSubmit(exclude);
                        bd.SubmitChanges();

                        this.Clean();
                        CrudButtonResolver.SetStateBlank(lstButton);
                        MessageBox.Show("Entidade excluída com sucesso.");
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        public void btnCancelar_Click(object sender, RoutedEventArgs e)
        {
            this.Clean();
            CrudButtonResolver.SetStateBlank(lstButton);
        }

        public void btnSair_Click(object sender, RoutedEventArgs e)
        {
            if (MessageBox.Show("Tem certeza que deseja sair?", "Mail Sender", MessageBoxButton.YesNo) == MessageBoxResult.Yes)
                this.Close();
        }

        public void Clean()
        {
            entidade = null;

            this.gridForm.IsEnabled = false;
            this.txtNome.Text = String.Empty;
            this.txtCelular.Text = String.Empty;
            this.txtEmail.Text = String.Empty;
            this.txtTelefone.Text = String.Empty;
            this.dptNascimento.Text = String.Empty;
            this.cboGrupo.SelectedIndex = -1;
        }

        public void LoadEntity()
        {
            try
            {
                if (entidade == null)
                    entidade = new Pessoa();

                entidade.Nome = this.txtNome.Text;
                if(!String.IsNullOrEmpty(this.txtCelular.Text))
                    entidade.Celular = this.txtCelular.Text.Replace("-", "");
                if (!String.IsNullOrEmpty(this.txtTelefone.Text))
                    entidade.Telefone = this.txtTelefone.Text.Replace("-", "");
                entidade.Email = this.txtEmail.Text;
                if (this.dptNascimento.SelectedDate != null)
                    entidade.Nascimento = this.dptNascimento.SelectedDate;
                if(this.cboGrupo.SelectedValue != null)
                    entidade.CodigoGrupo = Int32.Parse(this.cboGrupo.SelectedValue.ToString());
            }
            catch (Exception)
            {
                throw;
            }
        }

        public void Validate()
        {
            if (String.IsNullOrEmpty(this.txtNome.Text))
                throw new Exception("Favor preencher o campo Nome.");

            if (!String.IsNullOrEmpty(this.txtCelular.Text))
            {
                if (this.txtCelular.Text.Replace("-", "").Length != 8)
                    throw new Exception("Campo Celular está preenchido incorretamente.");
            }

            if (!String.IsNullOrEmpty(this.txtTelefone.Text))
            {
                if (this.txtTelefone.Text.Replace("-", "").Length != 8)
                    throw new Exception("Campo Telefone está preenchido incorretamente.");
            }

            if (!this.txtEmail.Text.Contains("@") || !this.txtEmail.Text.Contains("."))
                throw new Exception("Campo Email está preenchido incorretamente.");
        }

        #endregion

        #region Auxiliars Functions

        protected void CarregaGrupos()
        {
            try
            {
                using(Data db = new Data(Util.getConnectionString()))
                {
                    this.cboGrupo.ItemsSource = db.Grupos.ToList();
                }
            }
            catch (Exception)
            {
                throw;
            }
        }

        #endregion

        #region Window Events
        
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.CarregaGrupos();
        }
        #endregion


    }
}
